/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import java.util.*;
import javax.crypto.Mac;
import javax.management.timer.Timer;
import persistencia.PersistenciaAlquiler;
import persistencia.PersistenciaMovimiento;
import vista.ObtenerTeclado;
//import vccibernos.Articulo;

/**
 *
 * @author JAVA
 */
public class GestionInformes {


    /*
     * Obtiene la Lista de Movimientos del Cliente determinado y los Representa
     */
    public static void listaMovimientos(Cliente c) {
        int indice = 0;
        String res = "";
        System.out.println("Lista de Movimientos");
        System.out.print("");

        List<Movimiento> listaMovimientos = PersistenciaMovimiento.mostrarMovimientos(c);

        System.out.println("Movimientos del Cliente de Id: " + c.getId() + ", Nombre: " + c.getNombre());
        if (!listaMovimientos.isEmpty()) {
            System.out.println("Numero    Fecha        Descripcion                 SaldoAntiguo SaldoNuevo  Cantidad");
            for (Movimiento movimiento : listaMovimientos) { //Recorre la Lista de Movimientos
                indice++;
                res = "";
                res = res + indice;
                for (int q = res.length(); q < 10; q++) { //Espacio
                    res = res + " ";
                }
                Calendar cal = Calendar.getInstance();
                cal.setTime(movimiento.getFecha()); //Inicia el cal(Calendar) con la fecha del Movimiento
                String fecha = cal.get(Calendar.DAY_OF_MONTH) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.YEAR); //Convierte en String el Dia,Mes y Año

                res = res + fecha;
                for (int q = res.length(); q < 23; q++) { //Espacio
                    res = res + " ";
                }
                if (movimiento.getConcepto().length() > 28) {
                    String concepto = movimiento.getConcepto().substring(0, 27);
                    res = res + concepto;
                } else {
                    res = res + movimiento.getConcepto();
                }
                for (int q = res.length(); q < 51; q++) { //Espacio
                    res = res + " ";
                }
                res = res + movimiento.getSaldoAntiguo();
                for (int q = res.length(); q < 64; q++) { //Espacio
                    res = res + " ";
                }
                res = res + movimiento.getSaldoNuevo();
                for (int q = res.length(); q < 76; q++) { //Espacio
                    res = res + " ";
                }
                res = res + movimiento.getCantidad();
                System.out.println(res);
            }
        } else {
            System.out.println("No Existen Movimientos sobre este Cliente!!");
        }

    }
    /*
     * Informacion sobre Ejemplares Más Alquilados y Menos Alquilados
     */

    public static void informeEjemplares() {
        int i = 1;
        String opc = "";
        do {
            System.out.println("Informes de Ejemplares:");
            System.out.println("");
            System.out.println("1. Lista Mas Veces Alquilados");
            System.out.println("2. Lista Menos Veces Alquilados (al menos una vez)");
            System.out.println("3. Lista No Alquilados Nunca");
            System.out.println("0. Salir");
            opc = ObtenerTeclado.dameCadena("Introduce la Opcion: ");
        } while (!"1".equals(opc) && !"2".equals(opc) && !"3".equals(opc) && !"0".equals(opc));
        i = Integer.parseInt(opc);
        if (i != 0) {
            String res = "";
            TreeMap<Integer, ArrayList<Articulo>> mapa = new TreeMap<Integer, ArrayList<Articulo>>();
            int contador = 0;
            switch (i) {
                //Recibe Mapa<Integer,Lista<Articulo>> ====> Mapa<VecesAlquilados,ListaArticulos>. Comienza a recorrerse
                //del indice más alto.
                case 1:
                    /*mapa = PersistenciaAlquiler.vecesAlquilados();
                    System.out.println("  Tipo      Nombre                 Soporte    Proveedor      VecesAlquilados");
                    contador = 0;
                    if (!mapa.isEmpty()) {
                    do {
                    int indice = mapa.lastKey(); //Devuelve el Indice más Alto
                    for (Articulo a : mapa.get(indice)) {
                    contador++; //Contador para Representar hasta 5 indices distintos
                    res = "  ";
                    String tipo = "";
                    if (a instanceof Pelicula) {
                    tipo = "Película";
                    } else {
                    tipo = "Juego";
                    }
                    res = res + tipo;
                    String nombre = a.getTitulo(); //nombre del Articulo
                    for (int q = res.length(); q <= 11; q++) { //Espacio
                    res = res + " ";
                    }
                    res = res + nombre;
                    String soporte = "";
                    if (a instanceof Juego) {
                    Juego juego = (Juego) a;
                    soporte = juego.getSoporte(); //soporte del Juego
                    } else {
                    soporte = "-----"; //pelicula no tiene soporte
                    }
                    for (int q = res.length(); q <= 35; q++) { //Espacio
                    res = res + " ";
                    }
                    res = res + soporte;
                    String proveedor = a.getProve().getNombre();
                    for (int q = res.length(); q <= 45; q++) { //Espacio
                    res = res + " ";
                    }
                    res = res + proveedor;
                    for (int q = res.length(); q <= 65; q++) { //Espacio
                    res = res + " ";
                    }
                    res = res + indice;
                    System.out.println(res);
                    }
                    mapa.remove(indice); //elimina el indice más Alto del Mapa hasta el momento
                    } while (!mapa.isEmpty() && contador <= 5); //Mientras el Mapa tiene elementos y el contador sea <= a 5 (5 indices distintos)
                    } else {
                    System.out.println("No hay informes para mostrar");
                    }
                    break;
                    //Recibe Mapa<Integer,Lista<Articulo>> ====> Mapa<VecesAlquilados,ListaArticulos>. Comienza a recorrerse
                    //del indice más bajo.   */
                    mostrarMasVecesAlquilados();
                case 2:
                    //Los menos alquilados son los que al menos se han alquilados una vez.
                    mapa = PersistenciaAlquiler.vecesAlquilados();
                    System.out.println("  Tipo      Nombre                 Soporte    Proveedor      VecesAlquilado");
                    contador = 0;
                    if (!mapa.isEmpty()) {
                        do {
                            int indice = mapa.firstKey(); //devuelve el Indice más Bajo
                            for (Articulo a : mapa.get(indice)) {
                                contador++; //Contador para Representar hasta 5 indices distintos
                                res = "  ";
                                String tipo = "";
                                if (a instanceof Pelicula) {
                                    tipo = "Película";
                                } else {
                                    tipo = "Juego";
                                }
                                res = res + tipo;
                                String nombre = a.getTitulo(); //nombre del Articulo
                                for (int q = res.length(); q <= 11; q++) { //Espacio
                                    res = res + " ";
                                }
                                res = res + nombre;
                                String soporte = "";
                                if (a instanceof Juego) {
                                    Juego juego = (Juego) a;
                                    soporte = juego.getSoporte(); //soporte del Juego
                                } else {
                                    soporte = "-----"; //pelicula no tiene soporte
                                }
                                for (int q = res.length(); q <= 35; q++) { //Espacio
                                    res = res + " ";
                                }
                                res = res + soporte;
                                String proveedor = a.getProve().getNombre();
                                for (int q = res.length(); q <= 45; q++) { //Espacio
                                    res = res + " ";
                                }
                                res = res + proveedor;
                                for (int q = res.length(); q <= 65; q++) { //Espacio
                                    res = res + " ";
                                }
                                res = res + indice;
                                System.out.println(res);
                            }
                            mapa.remove(indice); //elimina el Indice Actual del Mapa
                        } while (!mapa.isEmpty() && contador <= 5); //Hasta que el mapa se vacíe, o contador llegue a 5 (5 indices distintos)
                    } else {
                        System.out.println("Noy hay informes para mostrar");
                    }

                    break;
                //Recibe una lista con los Articulos que nunca han sido Alquilados
                case 3:
                    System.out.println("Lista De No Alquilados Nunca");
                    System.out.println("");
                    //recibe una Lista con los Articulos que nunca han sido alquilados
                    ArrayList<Articulo> lista = PersistenciaAlquiler.alquiladosNunca();
                    if (lista.isEmpty()) {
                        System.out.println("No Existe Ningún Artículo que No Haya Sido Alquilado!!");
                    } else {
                        System.out.println("  Id   Tipo      Nombre                          Soporte         Proveedor");
                        for (Articulo a : lista) {
                            res = "  ";
                            int id = a.getId();
                            res = res + id;
                            for (int q = res.length(); q < 7; q++) { //Espacio
                                res = res + " ";
                            }
                            String tipo = "";
                            if (a instanceof Pelicula) {
                                tipo = "Película";
                            } else {
                                tipo = "Juego";
                            }
                            res = res + tipo;
                            for (int q = res.length(); q <= 16; q++) { //Espacio
                                res = res + " ";
                            }
                            String nombre = a.getTitulo();
                            res = res + nombre;
                            for (int q = res.length(); q <= 48; q++) { //Espacio
                                res = res + " ";
                            }
                            String soporte = "";
                            if (a instanceof Juego) {
                                Juego juego = (Juego) a;
                                soporte = juego.getSoporte();
                            } else {
                                soporte = "-----";
                            }
                            res = res + soporte;
                            for (int q = res.length(); q <= 64; q++) { //Espacio
                                res = res + " ";
                            }
                            String proveedor = a.getProve().getNombre();
                            res = res + proveedor;
                            System.out.println(res);
                        }
                    }
                    break;
                case 0:
                    break;
            }
        }
    }
    /*
     * Representa la Lista de Alquileres y el Cliente que se le pasa
     */

    public static void alquileresPendientes(List<Alquiler> lista, Cliente c) {
        String res = "";
        if (!lista.isEmpty()) {
            System.out.println("IdArticulo   Artículo                  Tarifa   IdCliente   Cliente           Dni         Dias");
            for (Alquiler a : lista) { //Recorre la Lista de Alquileres
                long resta = new Date().getTime() - a.getFechaFin().getTime(); //Resta la Fecha Actual menos la Fecha Fin Alquiler en milisegundos
                //int diasFueraPlazo=(int) (resta%Timer.ONE_DAY); //Convierte la resta anterios a Dias (entero)
                double diasFueraPlazo = Math.ceil(resta / Timer.ONE_DAY);

                String dias;
                if (diasFueraPlazo > 0) {
                    dias = String.valueOf(diasFueraPlazo);
                } else {
                    dias = "Dentro del Plazo";
                }
                res = "";
                int id = c.getId();
                String nombreCliente = c.getNombre();
                String dni = c.getDni();
                String nomArticulo = a.getArticulo().getTitulo();
                int codigo = a.getArticulo().getId();
                res = res + codigo;
                for (int q = res.length(); q <= 12; q++) { //Espacio
                    res = res + " ";
                }
                res = res + nomArticulo;
                for (int q = res.length(); q <= 38; q++) { //Espacio
                    res = res + " ";
                }
                String precioTarifa = String.valueOf(a.getArticulo().getTarifa().getPrecioAlquiler());
                res = res + precioTarifa;
                for (int q = res.length(); q <= 49; q++) { //Espacio
                    res = res + " ";
                }
                res = res + id;
                for (int q = res.length(); q <= 59; q++) { //Espacio
                    res = res + " ";
                }
                res = res + nombreCliente;
                for (int q = res.length(); q <= 77; q++) { //Espacio
                    res = res + " ";
                }
                res = res + dni;
                for (int q = res.length(); q <= 89; q++) { //Espacio
                    res = res + " ";
                }
                res = res + dias;
                System.out.println(res);
            }
        } else {
            System.out.println("No existen Alquileres Pendientes en la Base de Datos!");
        }
    }
    /*
     * Obtiene los Alquileres No Devueltos de la base de datos y los Representa junto con su Cliente
     */

    public static void alquileresPendientes() {
        System.out.println("Informe de Alquileres Pendientes");
        System.out.println("");
        //System.out.println("1. Alquileres Pendientes ");
        //System.out.println("2. ");
        //System.out.println("3. Informes de Facturas Realizadas (Falta Implementar!!)");
        //int i=ObtenerTeclado.dameEntero("Introduce la Opcion: ");
        int i = 1;
        String res = "";
        switch (i) {
            case 1:
                //Obtiene de la Base de Datos un mapa de Alquiler y Cliente
                HashMap<Alquiler, Cliente> mapa = PersistenciaAlquiler.alquileresPendientes();
                if (!mapa.isEmpty()) {
                    System.out.println("IdArticulo   Artículo                      IdCliente   Cliente                Dni         Dias");
                    for (Alquiler a : mapa.keySet()) { //recorre los Alquileres del Mapa
                        long resta = new Date().getTime() - a.getFechaFin().getTime(); //Resta la Fecha Actual menos la Fecha Fin Alquiler en milisegundos
                        //int diasFueraPlazo=(int) (resta%Timer.ONE_DAY); //Convierte la resta anterios a Dias (entero)
                        double diasFueraPlazo = Math.ceil(resta / Timer.ONE_DAY);
                        String dias;
                        if (diasFueraPlazo > 0) {
                            dias = String.valueOf(diasFueraPlazo);
                        } else {
                            dias = "Dentro del Plazo";
                        }
                        res = "";
                        Cliente c = mapa.get(a);
                        int id = c.getId();
                        String nombreCliente = c.getNombre();
                        String dni = c.getDni();
                        String nomArticulo = a.getArticulo().getTitulo();
                        int codigo = a.getArticulo().getId();
                        res = res + codigo;
                        for (int q = res.length(); q <= 12; q++) { //Espacio
                            res = res + " ";
                        }
                        res = res + nomArticulo;
                        for (int q = res.length(); q <= 42; q++) { //Espacio
                            res = res + " ";
                        }
                        res = res + id;
                        for (int q = res.length(); q <= 54; q++) { //Espacio
                            res = res + " ";
                        }
                        res = res + nombreCliente;
                        for (int q = res.length(); q <= 77; q++) { //Espacio
                            res = res + " ";
                        }
                        res = res + dni;
                        for (int q = res.length(); q <= 89; q++) { //Espacio
                            res = res + " ";
                        }
                        res = res + dias;
                        System.out.println(res);
                    }
                } else {
                    System.out.println("No existen Alquileres Pendientes en la Base de Datos!");
                }
                break;

        }
    }
    /*
     * Obtiene de la Base de Datos los Clientes que más han Alquilado en el VideoClub
     */

    public static void mejoresClientes() {
        System.out.println("");
        TreeMap<Integer, ArrayList<Cliente>> mapa = PersistenciaAlquiler.mejoresClientes();
        int contador = 0;
        String res = "";
        System.out.println("Id    Nombre           Apellidos             Dni         NºAlquileres");
        contador = 0;
        if (!mapa.isEmpty()) {
            do {
                int indice = mapa.lastKey(); //Devuelve el Índice más Alto del Mapa
                for (Cliente cliente : mapa.get(indice)) { //Recorre la Lista de Clientes que contiene el Indice
                    contador++; //Contador para represtar solo 5 Indices diferentes
                    res = "";
                    int id = cliente.getId();
                    res = res + id;
                    for (int q = res.length(); q <= 5; q++) {
                        res = res + " ";
                    }
                    String nombre = cliente.getNombre();
                    res = res + nombre;
                    for (int q = res.length(); q <= 22; q++) {
                        res = res + " ";
                    }
                    String apellidos = cliente.getApellidos();
                    res = res + apellidos;
                    for (int q = res.length(); q <= 44; q++) {
                        res = res + " ";
                    }
                    String dni = cliente.getDni();
                    res = res + dni;
                    for (int q = res.length(); q <= 58; q++) {
                        res = res + " ";
                    }
                    res = res + indice;
                    System.out.println(res);
                }
                mapa.remove(indice); //Elimina el Indice Actual
            } while (!mapa.isEmpty() && contador <= 5); //Hasta que el Mapa está vacio o Contador es 5 (hasta 5 indices distintos)
        }
    }

    public static void mostrarMasVecesAlquilados() {
        TreeMap<Integer, Articulo> mapa = PersistenciaAlquiler.masVecesAlquilados();
        NavigableMap m2=mapa.descendingMap();
        Iterator it = m2.entrySet().iterator();
        System.out.println("Tipo\t\tNombre\t\tProveedor\t\tVeces Alquilados");
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            Articulo art=(Articulo)e.getValue();
            if(art  instanceof Pelicula){
                Pelicula p=(Pelicula)art;
                System.out.println("Pelicula\t"+p.getTitulo()+"\t"+p.getProve().getNombre()+"\t"+e.getKey());
            }
            else if(art instanceof Juego){
                Juego j=(Juego)art;
                System.out.println("Pelicula\t"+j.getTitulo()+"\t"+j.getProve().getNombre()+"\t"+e.getKey());
            }
            
        }


    }
}
